home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / software-center / update-software-center < prev   
Text File  |  2009-10-26  |  5KB  |  139 lines

  1. #!/usr/bin/python
  2. # Copyright (C) 2009 Canonical
  3. #
  4. # Authors:
  5. #  Michael Vogt
  6. #
  7. # This program is free software; you can redistribute it and/or modify it under
  8. # the terms of the GNU General Public License as published by the Free Software
  9. # Foundation; version 3.
  10. #
  11. # This program is distributed in the hope that it will be useful, but WITHOUT
  12. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  13. # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  14. # details.
  15. #
  16. # You should have received a copy of the GNU General Public License along with
  17. # this program; if not, write to the Free Software Foundation, Inc.,
  18. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  
  20.  
  21. import apt
  22. import locale
  23. import gettext
  24. import logging
  25. import os
  26. import os.path
  27. import sys
  28. import time
  29. import xapian
  30.  
  31. from optparse import OptionParser
  32.  
  33. from softwarecenter.enums import *
  34. from softwarecenter.db.update import rebuild_database
  35.  
  36. # dbus may not be available during a upgrade so we 
  37. # only set it up if its there
  38. try:
  39.     import dbus
  40.     import dbus.service
  41.     import glib
  42.     import gobject # without gobject it will crash
  43.     from dbus.mainloop.glib import DBusGMainLoop
  44. except ImportError:
  45.     pass
  46.  
  47. # add a bit of extra time between sending the "we-rebuild-the-db-now"
  48. # signal and the actual rebuilding to help the applications to shutdown
  49. # the DB access
  50. APP_CATCHUP_DELAY = 2
  51.  
  52. # the language pack directory that we need for the triggers checking
  53. LANGPACKDIR = "/usr/share/locale-langpack"
  54.  
  55. class UpdateSoftwarecenterDbus(dbus.service.Object):
  56.     """ 
  57.     This is a helper to provide the UpdateSoftwarecenterIFace
  58.     """
  59.     def __init__(self, bus_name,
  60.                  object_path='/com/ubuntu/Softwarecenter'):
  61.         dbus.service.Object.__init__(self, bus_name, object_path)
  62.  
  63.     @dbus.service.method('com.ubuntu.Softwarecenter')
  64.     def IsRebuilding(self):
  65.         return True
  66.     @dbus.service.signal(dbus_interface='com.ubuntu.Softwarecenter',
  67.                          signature='b')
  68.     def DatabaseRebuilding(self, isRebuilding):
  69.         logging.debug("Sending DatabaseRebuilding signal '%s'" % isRebuilding)
  70.  
  71.  
  72. if __name__ == "__main__":
  73.     try:
  74.         locale.setlocale(locale.LC_ALL, "")
  75.     except Exception, e:
  76.         logging.exception("setlocale failed")
  77.  
  78.     # parser
  79.     parser = OptionParser()
  80.     parser.add_option("--triggered", "", default="",
  81.                       help="triggered from dpkg")
  82.     parser.add_option("--debug", "", action="store_true", default=False,
  83.                       help="show debug output")
  84.     (options, args) = parser.parse_args()
  85.  
  86.     #logging.basicConfig(level=logging.INFO)
  87.     if options.debug:
  88.         logging.basicConfig(level=logging.DEBUG)
  89.  
  90.     # check if we are dpkg triggered because of langpack change
  91.     # and avoid unneeded database rebuilds by checking the timestamp
  92.     # of the app-install-data mo file
  93.     if options.triggered and options.triggered == LANGPACKDIR:
  94.         logging.debug("triggered with '%s'" % options.triggered)
  95.         mofile = gettext.find("app-install-data")
  96.         if not mofile:
  97.             logging.info("no translation information in database needed")
  98.             sys.exit(0)
  99.         mo_time = os.path.getctime(mofile)
  100.         pathname = os.path.join(XAPIAN_BASE_PATH, "xapian")
  101.         if os.path.exists(pathname):
  102.             db = xapian.Database(pathname)
  103.             mo_db_time = db.get_metadata("app-install-mo-time")
  104.             logging.debug("mo_time: %s db_mo_time: %s" % (mo_time, mo_db_time))
  105.             if str(mo_time) == mo_db_time:
  106.                 logging.info("translation information in database is up-to-date")
  107.                 sys.exit(0)
  108.  
  109.     # setup dbus
  110.     dbus_controller = None
  111.     try:
  112.         DBusGMainLoop(set_as_default=True)
  113.         bus = dbus.SystemBus()
  114.         bus_name = dbus.service.BusName('com.ubuntu.Softwarecenter', bus)
  115.         dbus_controller = UpdateSoftwarecenterDbus(bus_name)
  116.         dbus_controller.DatabaseRebuilding(True)
  117.         time.sleep(APP_CATCHUP_DELAY)
  118.     except:
  119.         logging.warn("Failed to setup dbus (ignoring)")
  120.  
  121.     # rebuild and send signal when done
  122.     try:
  123.         # setup path
  124.         pathname = os.path.join(XAPIAN_BASE_PATH, "xapian")
  125.         if not os.path.exists(pathname):
  126.             os.makedirs(pathname)
  127.         # rebuild the database, the default context is run to ensure
  128.         # dbus querries are processed
  129.         rebuild_database(pathname)
  130.     finally:
  131.         # signal that the xapian db is valid again
  132.         if dbus_controller:
  133.             time.sleep(APP_CATCHUP_DELAY)
  134.             dbus_controller.DatabaseRebuilding(False)
  135.             context = glib.main_context_default()
  136.             while context.pending():
  137.                 context.iteration()
  138.     
  139.